<?php
/**
 * 5、设计模式学习-原型模式
 * 人 控制器
 * 2019年12月8日16:34:58
 */
namespace Application\Controller;

use Application\Common\Prototype\PeopleNoUsePrototype as PeopleNoUsePrototype;
use Application\Common\Prototype\PeoplePrototype as PeoplePrototype;

class PeoplePrototypeController extends BaseController
{
    // 创建 人：没有使用 原型模式
    public function noUsePrototype()
    {
        // 创建第一个人
        $people = new PeopleNoUsePrototype();
        $people -> setName('张三');
        $people -> setSex('男');
        $people -> setAge('20岁');
        $people -> setCurrentStay(['time'=>'2019年','city'=>'北京']);
        // 获取人的信息
        $people_info = $people -> display();
        echo '第一个人的信息：<br />';
        export($people_info);

        echo '<hr />';

        $people2 = clone $people;
        $people2 -> setName('李四');
        $people2 -> setCurrentStay(['city'=>'上海']);
        $people_info2 = $people2 -> display();
        echo '第二个人的信息：<br />';
        export($people_info2);
        // 总结：创建第二个人的时候数据虽然复用了一些数据，但是暂住地信息定制型弱，且暂住信息扩展性差
        // [关键]创建第二个人的时候虽然使用了人类的原型，但却不是深度复制，暂住信息定制与扩展性相对较差
    }
    // 创建 人：使用 复制更加深入 的 原型模式，并进行了 暂住地类 的分离
    public function usePrototype()
    {
        // 创建第一个人
        $people = new PeoplePrototype();
        $people -> setName('张三');
        $people -> setSex('男');
        $people -> setAge('20岁');
        $people -> setCurrentStay(['stay_time'=>'2019年','stay_city'=>'北京']);

        // 创建第二个人
        $people2 = clone $people;
        $people2 -> setName('李四');
        $people2 -> setAge('18岁');
        $people2 -> setCurrentStay(['stay_city'=>'上海']);

        // 获取第一个人的信息
        $people_info = $people -> display();
        echo '第一个人的信息是：<br />';
        export($people_info);
        echo '<hr />';
        // 获取第二个人的信息
        $people_info2 = $people2 -> display();
        echo '第二个人的信息是：<br />';
        export($people_info2);
        // [关键]总结：使用原型模式的目的是当克隆本类时、需要一并克隆本类中的相关引用类，这样才能克隆出一个另外的类，且复用了相关数据，达到修改克隆后的类、不会同步修改到原类
        // 总结：如果类中没有使用其他的类，则不需要使用深度复制的原型模式，仅仅克隆原类即可。
    }
}
